package Year2013;

/**
 * 标题:马虎的算式
 * 小明是个急性子，上小学的时候经 常把老师写在黑板上的题目抄错了。
 * 有一次，老师出的题目是: 36 x 495 = ?
 * 他却给抄成了: 396 x 45 = ?
 * 但结果却很戏剧性，他的答案竟然是对的 ！
 * 因为 36*495 = 396*45 = 17820
 * 类似这样的巧合情况可能还有很多，比如: 27 * 594 = 297 * 54
 * 假设a b c d e代表 1~9 不同的 5 个数字(注意是各不相同的数字，且不含0)
 * 能满足形如:ab*cde=adb*ce这样的算式共有多少种呢?
 * 请你利用计算机的优势寻找所有的可能，并回答不同算式的种类数。
 * 满足乘法交换律的算式计为不同的种类所以答 案肯定是个偶数。
 */

/**
 * 解法：回溯法：全排列，
 */
public class C组_马虎算式02 {
    static int[] stack = new int[10000]; // 状态位
    static int top = 0;
    static int total = 0;
    public static void main(String[] args) {
        fun1(0);
        System.out.println(total);
    }
    public static void fun1(int n){
        if(n == 4){  // n 个元素里面选 r个元素
            int[] middle = new int[10];
            for (int i = 1; i < 10; i++) {
                middle[stack[0]] = 1;
                middle[stack[1]] = 1;
                middle[stack[2]] = 1;
                middle[stack[3]] = 1;
            }
            for (int i = 1; i < 10; i++) {
                if(middle[i] == 0){
                    int a = stack[0]*10 + stack[1];
                    int aMid = stack[0]*100 + i*10 + stack[1];
                    int b = stack[2]*10 + stack[3];
                    int bMid = stack[2]*100 + i*10 + stack[3];
                    if(a * bMid == aMid * b){
                        System.out.println(a+"*"+ bMid +"==" +aMid+ "*"+ b);
                        total++;
                    }
                }
            }
            return;
        }
        for (int i = 1; i <= 9; i++) {  //两个状态位，允许重复组合
            int flag = 0;
            for (int j = 0; j < top; j++) {
                if(stack[j] == i){
                    flag = 1;
                    break;
                }
            }
            if(flag == 1)
                continue;
            stack[top++] = i;
            fun1(n+1);
            top--;
        }
    }
}
